/*
 * ComponenteGeneradoInterno.java	 
 *
 * Copyright 2010 Universidad Francisco de Paula Santander (UFPS).
 * Todos los Derechos Reservados.
 * Creado el 07/10/10, 09:12:38 AM
 */

package com.ufps.cuatro.modelo.representacion.componente;

import com.ufps.cuatro.modelo.biblioteca.TipoBiblioteca;
import com.ufps.cuatro.util.Utileria;
import com.ufps.cuatro.util.base.ComponenteBaseStandar;

/**
 * <i><b>ComponenteGeneradoInterno:</b></i><p>Al Igual que la Clase <code>ComponenteGenerado</code>
 * Esta Clase permite generar representaciones simples de los Controles swing soportados en la Aplicación.</p>
 * <p>Sin embargo esta clase es utilizada unica y exclusivamente para representar el
 * Control que representa el Tipo de Dato del Modelo Anlaizado. Por lo tanto su uso es interno
 * y solo existe en las Representaciones del <code>ComponenteGenerador</code>.</p> 
 * 
 * @author Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @version 1.0 07/10/10
 * @see ComponenteGenerado 
 */
public class ComponenteGeneradoInterno extends ComponenteGenerado{
    private static final long serialVersionUID = 805475390121413396L;   
    
    private int idClaseComponenteGeneradoInterno;
    /**
     * Serie Númerica para la generación de id de Objetos.
     */
    public static int serialIdComponenteGeneradoInterno;  
    private String nameTipoDato = "";
    private String canonicalNameTipoDato = "";
    private String simpleNameTipoDato = "";
    
    /**
     * Contructor utilizado en la Implementación.
     * @param objComponenteBase Referencia al <code>ComponenteBaseStandar</code> que representa el Control.     
     * @param heredado Indica si el Componente es instanciado por Herencia.
     * @param previsualizar Indica si el Componente permite visualizaciones en la Aplicación.     
     */
    public ComponenteGeneradoInterno(ComponenteBaseStandar objComponenteBase, boolean heredado, boolean previsualizar) {
        super(objComponenteBase, true, true);
        this.heredado = heredado;
        this.previsualizar = previsualizar;
        this.dni = Utileria.leerRecursoTexto("Utileria.dni.componente.generado.interno"); 
        if(!heredado){
            this.idClaseComponenteGeneradoInterno = (!previsualizar) ?
                    ComponenteGeneradoInterno.serialIdComponenteGeneradoInterno++ :
                    ComponenteGeneradoInterno.serialIdComponenteGeneradoInterno;        
        }
    }

    /**
     * Devuelve el Id de Generación del Componente Generado.
     * @return Id de Generación del Componente Generado.
     */
    public int getIdClaseComponenteGeneradoInterno() {
        try{
        return idClaseComponenteGeneradoInterno;
        }catch(java.lang.NullPointerException ex){}
        return 0;
    }

    /**
     * Devuelve el CanonicalName del ClassPath del Tipo de Dato Soportado por el Componente.
     * @return CanonicalName del ClassPath del Tipo de Dato Soportado por el Componente.
     */
    public String getCanonicalNameTipoDato() {
       try{
        return canonicalNameTipoDato;
    }catch(java.lang.NullPointerException ex){}
       return "";
    }

    /**
     * Establece el CanonicalName del ClassPath del Tipo de Dato Soportado por el Componente.
     * @param canonicalNameTipoDato CanonicalName del ClassPath del Tipo de Dato Soportado por el Componente.
     */
    public void setCanonicalNameTipoDato(String canonicalNameTipoDato) {
       try{
        this.canonicalNameTipoDato = canonicalNameTipoDato;
    }catch(java.lang.NullPointerException ex){}
       
    }

    /**
     * Devuelve el Nombre del Tipo de Dato Soportado por el Componente.
     * @return Nombre del Tipo de Dato Soportado por el Componente.
     */
    public String getNameTipoDato() {
    try{
        return nameTipoDato;
    }catch(java.lang.NullPointerException ex){}
    return "";
    }

    /**
     * Establece el Nombre del Tipo de Dato Soportado por el Componente.
     * @param nameTipoDato Nombre del Tipo de Dato Soportado por el Componente.
     */
    public void setNameTipoDato(String nameTipoDato) {
       try{
        this.nameTipoDato = nameTipoDato;
        }catch(java.lang.NullPointerException ex){}
       
    }

    /**
     * Devuelve el Nombre Simple del Tipo de Dato Soportado por el Componente.
     * @return Nombre Simple del Tipo de Dato Soportado por el Componente.
     */
    public String getSimpleNameTipoDato() {
       try{
        return simpleNameTipoDato;
    }catch(java.lang.NullPointerException ex){}
       return "";
    }

    /**
     * Establece el Nombre Simple del Tipo de Dato Soportado por el Componente.
     * @param simpleNameTipoDato Nombre Simple del Tipo de Dato Soportado por el Componente.
     */
    public void setSimpleNameTipoDato(String simpleNameTipoDato) {
        this.simpleNameTipoDato = simpleNameTipoDato;
    }    

    @Override
    public String toString() {
       try{
        if(this.eBiblioteca == TipoBiblioteca.eSwap) {
            return this.objClassSwing.getSimpleName() + "BS" + dni + this.idClaseComponenteGeneradoInterno;
        }
        else if(this.eBiblioteca == TipoBiblioteca.eLocal) {
            return this.objClassSwing.getSimpleName() + "BL" + dni + this.idClaseComponenteGeneradoInterno;
        }
        else if(this.eBiblioteca == TipoBiblioteca.eGlobal) {
            return this.objClassSwing.getSimpleName() + "BG" + dni + this.idClaseComponenteGeneradoInterno;
        }
        else if(this.getObjPropiedadesDisponibles() != null){            
            //se evalua si la propiedad name ha sido inicializada
            if(!this.getObjPropiedadesDisponibles().isEmpty()){                
                return this.getName();
            }
        }
        return this.objClassSwing.getSimpleName() + dni + this.idClaseComponenteGeneradoInterno;
    }catch(java.lang.NullPointerException ex){}
       return "";
    }        

    @Override
    protected Object clone() {
       try{
        ComponenteGeneradoInterno objClon;
        //Primero se Clona la Referencia Local
        objClon = (ComponenteGeneradoInterno) super.clone();
        //Ahora se hace la Clonación Profunda                
        return objClon;
    }catch(java.lang.NullPointerException ex){}
       return null;
    }

    @Override
    public int compareTo(Object o) {
     try{
        ComponenteGeneradoInterno obj = (ComponenteGeneradoInterno) o;
        if(this.idClaseComponenteGeneradoInterno > obj.idClaseComponenteGeneradoInterno) {
            return 1;
        }
        else if(this.idClaseComponenteGeneradoInterno < obj.idClaseComponenteGeneradoInterno) {
            return -1;
        }
        else {
            return 0;
        }
    }catch(java.lang.NullPointerException ex){}
     return 0;
    }

    @Override
    public void ok() {
        if(this.previsualizar){
            this.idClaseComponenteGeneradoInterno = ComponenteGeneradoInterno.serialIdComponenteGeneradoInterno++;     
            this.previsualizar = false;
        }
    }

    @Override
    protected void actualizarGridBagConstraintsActiva() {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}
